package pl.edu.pk.psb.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import pl.edu.pk.psb.assembler.ParametryWyszukiwaniaWydarzenAssembler;
import pl.edu.pk.psb.bc.bo.WydarzenieBo;
import pl.edu.pk.psb.bc.dto.KategoriaDto;
import pl.edu.pk.psb.command.WyszukiwarkaWydarzenCommand;
import pl.edu.pk.psb.validator.WyszukiwarkaWydarzenValidator;

@Controller
public class WyszukiwarkaWydarzenController {

	@Autowired
	WyszukiwarkaWydarzenValidator wyszukiwarkaWydarzenValidator;
	
	@Autowired
	WydarzenieBo wydarzenieBo;
	
	@Autowired
	ParametryWyszukiwaniaWydarzenAssembler parametryWyszukiwaniaWydarzenAssembler;
	
	@RequestMapping(value = "/wyszukiwarkaWydarzen")
	public ModelAndView przekierujDoWyszukiwarki(){
		Map<String, Object> model = new HashMap<String, Object>();
		List<KategoriaDto> kategorie = wydarzenieBo.pobierzGlowneKategorie();
		kategorie.add(0, dodajPustaKategorie());
		model.put("kategorie", kategorie);
		return new ModelAndView("wyszukiwarkaWydarzen", model);
	}
	
	
	@RequestMapping(value = "/wyszukiwarkaWydarzen", method=RequestMethod.POST)
	public ModelAndView wyszukajWydarzenie(@ModelAttribute("command") WyszukiwarkaWydarzenCommand command, BindingResult wynik){
		Map<String, Object> model = new HashMap<String, Object>();
		List<KategoriaDto> kategorie = wydarzenieBo.pobierzGlowneKategorie();
		kategorie.add(0, dodajPustaKategorie());
		model.put("kategorie", kategorie);
		wyszukiwarkaWydarzenValidator.validate(command, wynik);
		if (wynik.hasErrors()) {
			return new ModelAndView("wyszukiwarkaWydarzen", model);
		}
		model.put("wydarzenia", wydarzenieBo.wyszukajWydarzenia(parametryWyszukiwaniaWydarzenAssembler.konwertuj(command)));
		
		return new ModelAndView("wyszukiwarkaWydarzen", model);
	}
	
	private KategoriaDto dodajPustaKategorie(){
		KategoriaDto brakKategorii = new KategoriaDto();
		brakKategorii.setNazwa("brak");
		KategoriaDto pustaKategoria = new KategoriaDto();
		pustaKategoria.setId(0);
		brakKategorii.getPodkategorie().add(pustaKategoria);
		return brakKategorii;
	}
	
	@ModelAttribute("command")
	public WyszukiwarkaWydarzenCommand stworzWyszukiwarkaWydarzenCommand() {
		return new WyszukiwarkaWydarzenCommand();
	}
}
